package com.luffy.mobile.browser.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MobileBrowserUtil {

	/**
	 * 키워드 형태를 가지고 있는 enum
	 */
	public static enum MobileBrowserType {
		WM_POLARIS_LGT("WM_POLARIS_LGT"), POLARIS_LGT("POLARIS_LGT"), POLARIS_SKT("POLARIS_SKT"), OPERA("OPERA"),
		SAFARI_OVER_iOS_4_2("SAFARI_OVER_iOS_4_2"), SAFARI_UNDER_iOS_4_2("SAFARI_UNDER_iOS_4_2"), 
		ANDROID_WEBKIT("ANDROID_WEBKIT"), DOLFIN("DOLFIN"), IE("IE"), LGT_WEBVIEWER("LGT_WEBVIEWER"), OTHERS("OTHERS");

		private String browserName = null;

		/**
		 * 브라우저명 리턴
		 * 
		 * @param browserName 브라우저명
		 */
		private MobileBrowserType(String browserName) {
			this.browserName = browserName;
		}

		public String getBrowserName() {
			return this.browserName;
		}
	}

	/**
	 * 모바일 브라우저 종류 리턴
	 * 
	 * @param ua USER AGENT
	 * @param sktua SKT USER AGENT
	 * @return 모바일 브라우저 종류
	 */
	public static MobileBrowserType getBrowserType(String ua, String sktua) {
		ua = ua == null? "" : ua.toLowerCase();
		sktua = sktua == null ? "" :sktua.toLowerCase();

		if (ua.contains("windows ce") && ua.contains("polar")) {
			return MobileBrowserType.WM_POLARIS_LGT;
		} else if (ua.startsWith("mozilla") && ua.contains("polar")) {
			return MobileBrowserType.POLARIS_LGT;
		} else if (ua.contains("mozilla") && ua.contains("natebrowser")) {
			return MobileBrowserType.POLARIS_SKT;
		} else if (ua.contains("opera") && (ua.contains("skt") || ua.contains("windows ce"))) {
			return MobileBrowserType.OPERA;
		} else if (ua.contains("iphone") || ua.contains("ipod") || ua.contains("ipad")) {
			Pattern iOsPattern = Pattern.compile("os (\\d)_(\\d)(_(\\d))?");
			Matcher iOsMatcher = iOsPattern.matcher(ua);

			if (iOsMatcher.find()) {
				String major = iOsMatcher.group(1);
				String minor = iOsMatcher.group(2);
				
				if (Integer.parseInt(major) >= 4 && Integer.parseInt(minor) >= 2) {
					return MobileBrowserType.SAFARI_OVER_iOS_4_2;
				}
			}

			return MobileBrowserType.SAFARI_UNDER_iOS_4_2;
		} else if (ua.contains("android")) {
			return MobileBrowserType.ANDROID_WEBKIT;
		} else if (ua.contains("dolfin")) {
			return MobileBrowserType.DOLFIN;
		} else if (ua.contains("windows ce") && ua.contains("iemobile")) {
			return MobileBrowserType.IE;
		} else if (ua.matches("^mozilla.*wv[0-9]+.*lgtelecom.*")) {
			return MobileBrowserType.LGT_WEBVIEWER;
		} else {
			return MobileBrowserType.OTHERS;
		}
	}

	/**
	 * SVG를 지원하는 브라우저인지 여부.
	 * 
	 * 지도API의 경로 그리기가 가능하기 위해서는 SVG가 지원되어야 한다. 
	 * 현재(2010/06/15) 폴라리스와 안드로이드, 오페라는 제외함. (모바일에서는 사파리만 가능)
	 */
	public static boolean canSupportSVG(MobileBrowserType btype) {
		switch (btype) {
			case ANDROID_WEBKIT:
				return false;
			case IE:
				return false;
			case LGT_WEBVIEWER:
				return false;
			case OPERA:
				return false;
			case POLARIS_LGT:
				return false;
			case POLARIS_SKT:
				return false;
			case SAFARI_OVER_iOS_4_2:
				return true;
			case SAFARI_UNDER_iOS_4_2:
				return true;
			case DOLFIN:
				return false;
			case OTHERS:
				return true;
			case WM_POLARIS_LGT:
				return false;
			default:
				return false;
		}
	}

	/**
	 * 현재 위치 사용 기능을 지원하는 브라우저인지 여부
	 * 
	 * 현재(2010/06/16) 안드로이드/사파리 계열(아이폰,아이팟) 사용 가능
	 * 
	 * @param btype
	 * @return
	 */
	public static boolean canSupportGPS(MobileBrowserType btype) {
		switch (btype) {
			case ANDROID_WEBKIT:
				return true;
			case IE:
				return false;
			case LGT_WEBVIEWER:
				return false;
			case OPERA:
				return false;
			case POLARIS_LGT:
				return false;
			case POLARIS_SKT:
				return false;
			case SAFARI_OVER_iOS_4_2:
				return true;
			case SAFARI_UNDER_iOS_4_2:
				return true;
			case DOLFIN:
				return false;
			case OTHERS:
				return false;
			case WM_POLARIS_LGT:
				return false;
			default:
				return false;
		}
	}

	/**
	 * 콜링크 지원 여부
	 * 
	 * 현재(2010/07/14) 안드로이드/사파리 계열(아이폰,아이팟) 사용 가능
	 * 
	 * @param btype
	 * @return
	 */
	public static boolean canSupportCallLink(MobileBrowserType btype) {
		/*
		switch (btype) {
			case ANDROID_WEBKIT : return true;
			case IE : return false;
			case LGT_WEBVIEWER : return false;
			case OPERA : return false;
			case POLARIS_LGT : return false;
			case POLARIS_SKT : return false;
			case SAFARI : return true;
			case DOLFIN : return false;
			case OTHERS : return false;
			case WM_POLARIS_LGT : return false;
			default : return false;
		}
		*/

		return canSupportGPS(btype); // GPS 지원 여부 메쏘드와 같으므로 이것으로 대체
	}

	/**
	 * 지도API(javascript)를 지원할 수 있는 브라우저인지 여부. 
	 * 
	 * 성능상의 이유로 현재(2010/06) 폴라리스 계열은 제외한다.
	 * 
	 * @param btype
	 * @return
	 */
	public static boolean canSupportMapAPI(MobileBrowserType btype) {
		switch (btype) {
			case ANDROID_WEBKIT:
				return true;
			case IE:
				return false;
			case LGT_WEBVIEWER:
				return false;
			case OPERA:
				return true;
			case POLARIS_LGT:
				return false;
			case POLARIS_SKT:
				return false;
			case SAFARI_OVER_iOS_4_2:
				return true;
			case SAFARI_UNDER_iOS_4_2:
				return true;
			case DOLFIN:
				return false;
			case OTHERS:
				return true;
			case WM_POLARIS_LGT:
				return false;
			default:
				return false;
		}
	}

	/**
	 * 더보기 버튼 지원 여부
	 * 
	 * @param btype
	 * @return
	 */
	public static boolean canSupportMoreBtn(MobileBrowserType btype) {
		switch (btype) {
			case ANDROID_WEBKIT:
				return false;
			case IE:
				return false;
			case LGT_WEBVIEWER:
				return false;
			case OPERA:
				return false;
			case POLARIS_LGT:
				return false;
			case POLARIS_SKT:
				return false;
			case SAFARI_OVER_iOS_4_2:
				return true;
			case SAFARI_UNDER_iOS_4_2:
				return true;
			case DOLFIN:
				return false;
			case OTHERS:
				return false;
			case WM_POLARIS_LGT:
				return false;
			default:
				return false;
		}
	}

	/**
	 * 입력 키워드 삭제 버튼 출력 여부.
	 * 
	 * 스펙상의 문제로 폴라리스 계열은 제외한다.
	 * 
	 * @param btype
	 * @return
	 */
	public static boolean canSupportRemoveKeyword(MobileBrowserType btype) {
		/*
		switch (btype) {
			case ANDROID_WEBKIT : return true;
			case IE : return false;
			case LGT_WEBVIEWER : return false;
			case OPERA : return true;
			case POLARIS_LGT : return false;
			case POLARIS_SKT : return false;
			case SAFARI : return true;
			case DOLFIN : return false;
			case OTHERS : return true;
			case WM_POLARIS_LGT : return false;
			default : return false;
		}
		*/

		return canSupportMapAPI(btype); // 지도 지원 여부 메쏘드와 같으므로 이것으로 대체
	}
}
